﻿//----------------------------------------------------------------
// Desc: 
// Edit: ShowLong, http://blog.csdn.net/showlong
//
// Date Created: 2009-10-16
//
// Update Date :            
//
// Copyright (c) Fuel4D (http://www.fuel4d.com), All rights reserved.
//
//----------------------------------------------------------------
#pragma once


class FAPI FUI_Layout : public IFUI_MemObject
{
    friend class FUI_Object;
    friend class FUI_Frame;
    friend class FUI_System;
    friend class FUI_Container;
    friend class FUI_SYS_DRAG_FRINGE;

protected:
    // 构造函数
    FUI_Layout(const ACHAR* filename);
    // UI数据加载成功以后，UI系统调用此通知函数
    virtual bool OnCreate() = 0;
    // UI正常卸载前或OnCreate调用失败时，调用此通知函数
    virtual void OnDestroy() = 0;
    // UI系统在刷新处理结束后，调用此通知函数
    virtual void OnUpdate(){}
    // UI系统在绘制完框架底板后，绘制控件前、后调用此通知函数
    virtual void OnRender(bool before) = 0;
    // UI事件回调 (框架ID, 控件ID, 消息ID, 参数1, 参数2)， 不拦截消息返回 (false)
    virtual bool OnMessage(FIDHASH frame_id, FIDHASH widget_id, EF_UI_EVENT_TYPE message, DWORD wparam, DWORD lparam){ return false; }
    // 创建UI控件时回调 (不是自定义控件返回0)
    virtual FUI_Object* NewWidget(FIDHASH widget_id){ return 0; }
    // 消毁UI控件时回调 (返回是否已经被删除)
    virtual bool DelWidget(FIDHASH widget_id, FUI_Object* obj){ return false; }
    // 框架或者控件尺寸发生了变化时通知(nWidgetID 可能是框架ID，也可能是框架内部控件ID)
    virtual void OnSizeChange(FIDHASH widget_id){}

public:
    // 析构函数
    virtual~FUI_Layout();
    // 设置可见，返回可见状态
    virtual bool SetVisible(bool bShow);
    // 获得当前是否可见
    virtual bool IsVisible();

    // 加载UI
    bool LoadUI(FUI_System* sys);
    // 释放UI
    void UnLoad();

    // 取得分组信息
    FINLINE DWORD GetGroupID(){ return dwGroupID; }
    // 取得框架UI地址
    FINLINE FUI_Frame* GetFrameData(){ return pFRAME; }
    // 返回UI框架是否加载结束(含UI关联与控件初始化等)
    FINLINE bool IsLoadFinish(){ return bLoadFinish; }

protected:
    ACHAR szUIFilename[80]; // UI文件名
    bool bLoadFinish;       // 是否加载完成
    DWORD dwGroupID;        // 提供给客户使用UI分组ID
    FUI_System* pUIMgr;     // 我所在UI管理器地址
    FUI_Frame* pFRAME;      // 我所对应的框架地址
};
